package com.leetcode.demo01;

/*给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。

 你可以假设每种输入只会对应一个答案。但是，你不能重复利用这个数组中同样的元素。

 示例:

 给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

 Related Topics 数组 哈希表*/


import java.util.HashMap;

class Solution {

/*
    //1、暴力法
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if (nums[i]+nums[j] == target) {
                    return new int[]{i,j};
                }
            }
        }
        return null;

    }*/

/*    //2、改进版  哈希法
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            hashMap.put(nums[i],i);
        }

        for (int i = 0; i < nums.length; i++) {
            int y = target - nums[i];
            if(hashMap.containsKey(y) && hashMap.get(y) != i) {
                return new int[]{i,hashMap.get(y)};
            }
        }
        return null;

    }*/

    //3、再次改进版 一次哈希法
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            //hashMap.put(nums[i],i); 放在这里会导致同一个元素使用两次
            int y = target - nums[i];
            if(hashMap.containsKey(y) ) {
                return new int[]{i,hashMap.get(y)};
            }
            hashMap.put(nums[i],i); //必须放在后面
        }
        return null;

    }



}
